window.$=window.jQuery=function(selectorOrArrayOrTemplate){
    let elements
    if(typeof selectorOrArrayOrTemplate==='string'){
        if(selectorOrArrayOrTemplate[0]==='<'){
            elements=[createElement(selectorOrArrayOrTemplate)]
        } else {
            elements=document.querySelectorAll(selectorOrArrayOrTemplate)
        }
    }else if(selectorOrArrayOrTemplate instanceof Array){ //对象一般用instanceof
        elements=selectorOrArrayOrTemplate
    }
    function createElement(string){
        const container =document.createElement('template') 
        //template专门用来容纳，不在页面中显示出来，可以容纳任意元素，但是不能用children拿到元素
        container.innerHTML=string.trim() //trim()之后保证字符串的前面无空格
        return container.content.firstChild  //template拿到元素的方法
    }
    const api=Object.create(jQuery.prototype) //创建一个对象，这个对象的__proto__为括号里面的东西
    Object.assign(api,{
        elements:elements,
        oldApi:selectorOrArrayOrTemplate.oldApi
    })
    return api
};
jQuery.fn=jQuery.prototype={  //创建一个jQuery.prototype,将所有jQuery公用的部分放进去，再创建一个api对象，这个对象的__proto__为jQuery.prototype，然后返回api对象
    constructor:jQuery,
    jquery:true,
    get(index) {
        return this.elements[index];
      },
      appendTo(node){
          if(node instanceof Element){
              this.each((e1)=>{node.appendChild(e1)}) 
          }else if(node.jquery===true){
              this.each(e1=>node.get(0).appendChild(e1))
          }
      },
      append(children){
          if(children instanceof Element){  //元素
              this.get(0).appendChild(children)
          }else if(children instanceof HTMLCollection){  //HTML集合
              for(let i=0;i<children.length;i++){
                  this.get(0).appendChild(children[i])
              }
          }else if(children.jquery===true){
              children.each((node)=>{this.get(0).appendChild(node)})
          }
      },
    addClass(className){
        for(let i=0;i<this.elements.length;i++){
            this.elements[i].classList.add(className)
        } 
        return this //如果命名了对象可以返回对象的名字，但是这样写更简洁
    },
    find(selector){
        let array=[]
        for(let i=0;i<this.elements.length;i++){
            array=array.concat(Array.from(this.elements[i].querySelectorAll(selector)))
        }
        return jQuery(array) //将array作为参数放进jQuery之后返回的对象就可以操作里面的元素了
        //但是jQuery之前的设定只接受选择器，所以要更改，在做一个判断
    },
    print(){
        console.log(this.elements) //打印出里面的元素
    },
    each(fn){
        for(let i=0;i<this.elements.length;i++){
            fn.call(null,this.elements[i],i)
        }
        return this  //this 是api
    },
    parent(){
        const array=[]
        this.each((node)=>{  //this 是api
            if(array.indexOf(node.parentNode)===-1){ //当node的parentNode不存在的时候就push
                array.push(node.parentNode)
            }
        }) 
        return jQuery(array)
    },
    children(){
        let array=[]
        this.each((node)=>{
            if(array.indexOf(node.parentNode)===-1){
                array.push(...node.children) //...表示将里面的元素拆开来
                //以上代码可以替换成array=array.concat(Array.from(node.children))
            }
        })
        return jQuery(array)
    },
}